package com.atguigu.java1;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import org.junit.Test;

/*
 * 处理流之六：对象流的使用  ObjectInputStream 和 ObjectOutputStream
 * 作用：存储和读取基本数据类型数据或对象的处理流。
 * 它的强大之处就是可以把Java中的对象写入到数据源中，也能把对象从数据源中还原回来。
 * 
 * 
 */
public class ObjectInputOutputStreamTest {
	
	//反序列化过程：读取文件、通过网络传输过来 ---> 还原为内存中的java对象
	@Test
	public void testObjectInputStream() throws Exception{
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.txt"));
		
//		String str1 = (String) ois.readObject();
//		String str2 = (String) ois.readObject();
//		System.out.println(str1);
//		System.out.println(str2);
		
		Person p1 = (Person)ois.readObject();
		Person p2 = (Person)ois.readObject();
		
		System.out.println(p1);
		System.out.println(p2);
		
		ois.close();
	}
	
	//序列化过程：内存中的java对象 ---> 写入文件、通过网络传输出去
	//使用ObjectOutputStream实现
	@Test
	public void testObjectOutputStream() throws Exception{
		
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.txt"));
		
//		String str1 = new String("我爱北京天安门");
//		String str2 = new String("我爱美女！");
//		
//		oos.writeObject(str1);
//		oos.flush();
//		oos.writeObject(str2);
//		oos.flush();
		
		
		Person p1 = new Person("Tom",12,new Pet("花花"));
		Person p2 = new Person("明辉",22,new Pet("大黄"));
		
		oos.writeObject(p1);
		oos.flush();
		oos.writeObject(p2);
		oos.flush();
		
		oos.close();
		
	}
	
	
	
}

/*
 * 自定义类如何实现序列化，需要满足：
 * 1.自定义类实现Serializable接口
 * 2.在类中声明serialVersionUID
 * 3.要求自定义类的所有属性都是可序列化的
 * 
 * 说明：ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量
 */
class Person implements Serializable{ //Serializable:标识接口
	
	/**
	 * 用于唯一的标识当前类
	 */
	private static final long serialVersionUID = 13452353425345L;
	String name;
	int age;
	Pet pet;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	public Person(String name, int age,Pet pet) {
		super();
		this.name = name;
		this.age = age;
		this.pet = pet;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", pet=" + pet + "]";
	}

	
	
}

class Pet implements Serializable{//宠物
	 
	private static final long serialVersionUID = 345345345L;

	String name;

	public Pet(String name) {
		super();
		this.name = name;
	}

	@Override
	public String toString() {
		return "Pet [name=" + name + "]";
	}
	
}

